package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.Klasse;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.RepaintManager;

/**
 * Ansicht der Lehreinheiten (Stundenplanansicht). <br>
 * <br>
 * Im Gegensatz zu {@link LehreinheitView} stellt diese View die Lehreinheiten
 * in Form eines grafischen und maßstabsgetreuen Stundenplans dar. Durch
 * Doppelklick lässt sich eine Lehreinheit bearbeiten.
 * 
 * @author Viktor Reiser
 */
public class LehreinheitNiceView extends JPanel implements AppView {
    
    private LehreinheitNicePanel lehreinheitPanel;
    private JComboBox klasseComboBox;
    
    
    public LehreinheitNiceView() {
        setLayout(new FormLayout(
                "pref, 5px, fill:pref:grow, 5px, pref, 5px, pref",
                "pref, 5px, fill:pref:grow"));
        CellConstraints cc = new CellConstraints();
        
        klasseComboBox = new JComboBox();
        klasseComboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                loadView();
            }
        });
        
        lehreinheitPanel = new LehreinheitNicePanel();
        
        JButton printButton = new JButton("Drucken", 
                new ImageIcon("images/print.png"));
        printButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (true) {
                    App.showHelpDialog("<html>Funktion vorrübergehend deaktiviert, "
                            + "da diese noch nicht ausreichend getestet wurde!", 350, 70);
                    return;
                }
                
                PrinterJob printJob = PrinterJob.getPrinterJob();
                printJob.setPrintable(new Printable() {
                    @Override
                    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
                        if (pageIndex > 0) {
                            return(NO_SUCH_PAGE);
                        } else {
                            Graphics2D g2d = (Graphics2D)graphics;
                            
                            g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                            
                            RepaintManager currentManager = RepaintManager.currentManager(lehreinheitPanel);
                            currentManager.setDoubleBufferingEnabled(false);
                            
                            lehreinheitPanel.paint(g2d);
                            
                            currentManager.setDoubleBufferingEnabled(true);
                            
                            return(PAGE_EXISTS);
                        }
                    }
                });
                
                if (printJob.printDialog()) {
                    try {
                        printJob.print();
                    } catch(PrinterException pe) {
                        System.out.println("Error printing: " + pe);
                    }
                }
            }
        });
        
        add(new JLabel("Klasse:"), cc.xy(1, 1));
        add(klasseComboBox, cc.xy(3, 1));
        add(printButton, cc.xy(5, 1));
        add(App.createInfoButton("<html>Für diese Ansicht gelten die selben Regeln, wie für die normale "
                + "Stundenplanansicht. In dieser wird einfach mehr Bedienungskomfort geboten.<br><br>"
                + "An den oberen und unteren Rändern kann man die Dauer der Lehreinheit verändern.<br><br>"
                + "In der Mitte kann man die Lehreinheit mit gedrückter rechter Maustaste nach oben oder unten verschieben.<br><br>"
                + "Wenn man zusätzlich <i>STRG</i> drückt, wird die Lehreinheit zwischen den Tagen und Lehreinheiten verschoben.<br><br>"
                + "Mit Doppelckklick kann man Lehreinheiten bearbeiten und mit Rechtsklick kann man Lehreinheiten "
                + "erstellen, bearbeiten oder löschen.", 400, 280), cc.xy(7, 1));
        add(lehreinheitPanel, cc.xyw(1, 3, 7));
    }
    
    
    private void loadView() {
        lehreinheitPanel.loadView(this, klasseComboBox.getItemCount() == 0
                ? 0 : ((Klasse)klasseComboBox.getSelectedItem()).getId());
    }
    
    
    @Override
    public void refreshView() {
        // lade alle vorhandenen Klassen in die Combobox
        klasseComboBox.removeAllItems();
        
        for (Klasse klasse : App.getDatabase().getKlassen()) {
            klasseComboBox.addItem(klasse);
        }
        
        loadView();
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public String getViewName() {
        return "Stundenplan (Optional)";
    }
}
